import { formatDate, getCurrentDirPath } from "../utils/fs";
import { success, fail } from "../utils/base";
import axios from "axios";
import { getBDCConfig } from "../utils/lokijs-db-server";

let logMax = 2000; // 最大保存条数

/**
 * @description: teams 通知
 * @param {any} val 请求参数
 */
const sendTeamsMsg = async (val: any) => {
  axios.post(val.url, val.body);
};

export default defineEventHandler(async (event) => {
  // 0. 获取请求参数 post
  const body = await readBody(event);
  // console.log("获取请求参数：", body);
  // 1. 读取配置文件
  const { configData, configPath } = getBDCConfig();

  // 5. 控制日志上报功能开关
  if (body.isOpenLogReport === false) {
    configData.isEnable = false;
    // 保存 配置文件
    creatContentToPathSync(configPath, JSON.stringify(configData, null, 2));
    return success({ msg: "关闭-日志上报" });
  } else if (body.isOpenLogReport === true) {
    configData.isEnable = true;
    creatContentToPathSync(configPath, JSON.stringify(configData, null, 2));
    return success({ msg: "开启-日志上报" });
  }

  // 6. 拦截
  const db = event.context.db;
  if (!db) {
    return fail("数据库实例不存在! ❌");
  } else if (!configData.isEnable) {
    return success({ msg: "未开启日志上报功能" });
  }

  /******** start 上报过滤 start ********/
  // 8. 如果是图片加载失败,直接过滤掉,不需要保存(目前平台大部分用户的头像都有问题)
  if (body.data && body.data.name && body.data.name.includes("图片加载失败")) {
    return success("图片加载失败,已过滤");
  }
  // 过滤已下两种情况数据 1. "message": "资源地址: https://asset.onetrader.online/",   2. "message": "资源地址: ",
  if (body.data && body.data.name && body.data.name.includes("link加载失败")) {
    if (
      body.data.message &&
      body.data.message.includes("资源地址") &&
      (body.data.message.length < 10 ||
        body.data.message == "资源地址: https://asset.onetrader.online/")
    ) {
      return success("link加载失败,无具体地址 OR 地址有误,已过滤");
    }
  }
  // 过滤掉 Script error 错误
  if (body.data && body.data.message) {
    if (body.data.message.includes("Script error")) {
      return success("Script error,已过滤");
    }
  }

  /******** end 插入数据 end ********/
  // 获取或创建名为 'watchErrLog' 的集合; 用于保存错误监控日志
  let watchErrLog = db.getCollection("watchErrLog");
  if (watchErrLog === null) {
    watchErrLog = db.addCollection("watchErrLog");
  }

  // 9.1 防止数据过大 上限 logMax 条 || g.isSizeMax
  if (watchErrLog.data.length > logMax) {
    watchErrLog.data.list.shift();
  }

  // 9.3 插入数据
  if (body.authInfo) {
    watchErrLog.insert({
      time: formatDate(new Date()),
      ...body,
    });
    // 9.3.1 获取配置 将 24 小时内的异常信息进行teams上报
    let errors: any = 0;
    if (configData) {
      if (!configData.noticSuccessTime && new Date().getHours() >= 8) {
        const now = new Date();
        // 设置当前日期的时间为早上8点半, 避免时间差越来越大
        now.setHours(8, 30, 0, 0); // 时, 分, 秒, 毫秒
        configData.noticSuccessTime = now.getTime();
        const bdtime = now.getTime() - 24 * 60 * 60 * 1000;
        watchErrLog.data.forEach((element: any) => {
          if (element.time) {
            if (new Date(element.time).getTime() > bdtime) {
              errors += 1;
            }
          }
        });
        // 发送消息
        if (body.deviceInfo.env) {
          const qz =
            body.deviceInfo.env == "test"
              ? "test-"
              : body.deviceInfo.env == "prep"
              ? "pre-"
              : "";
          let text = `BDC-h5项目(bdc-earlyimport):${
            body.deviceInfo.env || ""
          }环境,24小时内记录异常${errors}条,请点击预览: https://${qz}bdc.btcdana.org/fx/log/errorlog?who=zhj`;
          if (body.deviceInfo.env !== "dev") {
            try {
              await sendTeamsMsg({
                url: "https://open.larksuite.com/open-apis/bot/v2/hook/80e3ea40-7807-445f-b9e2-10e2f3e07f80",
                body: {
                  msg_type: "text",
                  content: {
                    text,
                  },
                },
                // url: "https://bot.okmax.vip/api/notify_messages",
                // body: {
                //   secret: "pw#QHHPx!sk7nzX4",
                //   text,
                //   bot_id: "28:0020fede-30a5-47bc-b88c-53b6e40d54e5",
                //   bot_name: "ops_aod_bot", // 名字:改这里不生效
                //   conversation_id:
                //     "19:bab5666d53e54c269576c05d2ea2d2d0@thread.v2",
                //   service_url: "https://smba.trafficmanager.net/emea/",
                // },
              });
            } catch (error: any) {
              errors = error.message;
            }
          }
        }
      } else if (configData && configData.noticSuccessTime) {
        if (Date.now() - configData.noticSuccessTime > 24 * 60 * 60 * 1000) {
          configData.noticSuccessTime = null;
        }
      }
      // 保存 配置文件
      creatContentToPathSync(configPath, JSON.stringify(configData, null, 2));
    }

    return success({
      errors,
    });
  } else {
    return success({ msg: "插入内容格式不正确", body });
  }
});
